////////////////////////////////////////////////////////////////////
// Programme de traitement des personnages de Chrono Cross
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
// Nemesis pour Terminus Traduction (tt_nemesis@yahoo.fr)
// Date de création :		07/10/03
// Dernière modification :	07/10/03
////////////////////////////////////////////////////////////////////

// Entete
#include "Persos.h"

// Nombre de blocs des scénarii
char *Persos[PERSO_MAX_NB];
_int16 Perso_Nb;
_int16 Perso_Offset;

/*------------------------------------------------------------------
  Initialisation des fichiers pour les personnages
------------------------------------------------------------------*/
void Perso_Infos (void)
{
	// Fichier des infos
	FILE *infos_f;
	// Nom de l'iso (chemin)
	char infos_nom[PERSO_NOM_MAX];
	// Ligne
	char ligne[PERSO_LIGNE_MAX];

	// Ouverture du fichier des infos principales
	sprintf(infos_nom,"%s%s.%s",
		DIR_INFOS,INFOS_PERSOS,EXT_INFOS);
	infos_f=fopen(infos_nom,"rb");

	if (infos_f==NULL)
		Main_Message_S("Erreur d'ouverture des infos.\n","",ER);
	else {
		// Réinitialisation
		Perso_Nb=0;
		// Numero de fichier d'offset
		fgets(ligne,PERSO_LIGNE_MAX,infos_f);
		sscanf(ligne,"%d",&Perso_Offset);
		// Récupération des noms de fichiers
		while (fgets(ligne,PERSO_LIGNE_MAX,infos_f)!=NULL)
			// Cas d'un commentaire ou d'un blanc
			if (ligne[0]!=COMMENT) {
				ligne[strlen(ligne)-2]=0;
				Persos[Perso_Nb]=strdup(ligne);
				Perso_Nb++;
			}
		// Fermeture du fichier des infos
		fclose(infos_f);
	}
}

/*------------------------------------------------------------------
  Ecriture d'une ligne de caractères
------------------------------------------------------------------*/
void Perso_Ligne(int larg, FILE *out_f)
{
	int l;

	// Ecriture
	for(l=0;l<larg;l++)
		fputc(PERSO_SPEC_CAR,out_f);
}

/*------------------------------------------------------------------
  Affichage d'une ligne de caractères à l'écran
------------------------------------------------------------------*/
void Perso_Message(char *message, FILE *out_f)
{
	// Largeur et demi-largeur de caractères
	int demi,larg;

	// Création de la chaîne à écrire
	larg=strlen(message)+2;
	demi=(PERSO_LARGEUR-larg)/2;
	// Ecriture
	Perso_Ligne(PERSO_LARGEUR,out_f);
	fputc('\n',out_f);
	Perso_Ligne(demi,out_f);
	fprintf(out_f," %s ",message);
	Perso_Ligne(PERSO_LARGEUR-larg-demi,out_f);
	fputc('\n',out_f);
	Perso_Ligne(PERSO_LARGEUR,out_f);
	fputc('\n',out_f);
}

/*------------------------------------------------------------------
  Regroupement des descriptions en 1 seul fichier texte
------------------------------------------------------------------*/
void Perso_Regroupe (void)
{
	// Fichier entrant et sortant
	FILE *in_f,*out_f;
	char dossier[PERSO_NOM_MAX];
	char fich_nom[PERSO_NOM_MAX];
	char *fich_nom2;
	// Index des persos
	int i;
	// Ligne
	char ligne[PERSO_LIGNE_MAX];

	Main_Message_S("Rassemblement des descriptions...","",OK);

	// Chargement des noms des persos
	Perso_Infos();
	// Ouverture du fichier regroupé
	sprintf(fich_nom,"%s%s.%s",DIR_TXT_IN,DESCR_IN,EXT_TXT);
	out_f=fopen(fich_nom,"w");
	// Ecriture du titre
	Perso_Message("PERSONNAGES DE CHRONO CROSS",out_f);
	fputc('\n',out_f);
	// Copie effective
	for(i=0;i<Perso_Nb;i++) {
		// Ouverture du fichier descriptif
		sprintf(dossier,"%s%s%04d\\",DIR_FICH_IN,ENT_DOSSIER,
			i+Perso_Offset);
		Fichier_Cherche(dossier,PERSO_DESCR,EXT_TXT,&fich_nom2);
		sprintf(fich_nom,"%s%s",dossier,fich_nom2);
		in_f=fopen(fich_nom,"r");
		if (in_f==NULL)
			Main_Message_D("Script %03d introuvable.\n",i,ER);
		else {
			// Inscription du nom du perso
			Perso_Message(Persos[i],out_f);
			// Recopie du script "utile" (hors débogage)
			while(fgets(ligne,PERSO_LIGNE_MAX,in_f)>0)
				fputs(ligne,out_f);
			fputc('\n',out_f);
			// Fermeture du fichier
			fclose(in_f);
		}
	}
	fclose(out_f);

	Main_OK();
}

/*------------------------------------------------------------------
  Séparation des descriptions en plusieurs fichiers texte
------------------------------------------------------------------*/
void Perso_Partage (void)
{
	// Fichier entrant et sortant
	FILE *in_f,*out_f;
	char dossier[PERSO_NOM_MAX];
	char fich_nom[PERSO_NOM_MAX];
	char *fich_nom2;
	// Index des persos
	int i,j;
	// Ligne
	char ligne[PERSO_LIGNE_MAX];

	Main_Message_S("Separation des descriptions...","",OK);

	// Chargement des noms des persos
	Perso_Infos();
	// Ouverture du fichier regroupé
	sprintf(fich_nom,"%s%s.%s",DIR_TXT_OUT,DESCR_OUT,EXT_TXT);
	in_f=fopen(fich_nom,"r");

	// Chargement de la table
	Tbl_Charge(PERSO_TABLE, TBL_OUT);

	// Erreur d'ouverture ?
	if (in_f==NULL) {
		Main_Message_S("Fichier de descriptions introuvable.\n","",ER);
		return;
	}

	// Saut du titre + 1 ligne
	for(j=0;j<5;j++)
		fgets(ligne,PERSO_LIGNE_MAX,in_f);
	// Copie effective
	for(i=0;i<Perso_Nb;i++) {
		// Ouverture du fichier descriptif
		sprintf(dossier,"%s%s%04d\\",DIR_FICH_IN,ENT_DOSSIER,
			i+Perso_Offset);
		Fichier_Cherche(dossier,PERSO_DESCR,EXT_TXT,&fich_nom2);
		sprintf(dossier,"%s%s%04d\\",DIR_FICH_OUT,ENT_DOSSIER,
			i+Perso_Offset);
		sprintf(fich_nom,"%s%s",dossier,fich_nom2);
		out_f=fopen(fich_nom,"w");
		// Saut du nom du perso
		for(j=0;j<2;j++)
			fgets(ligne,PERSO_LIGNE_MAX,in_f);
		// Recopie du script "utile" (hors débogage)
		while(fgets(ligne,PERSO_LIGNE_MAX,in_f)>0 && ligne[0]!=PERSO_SPEC_CAR)
			Tbl_Ecriture(ligne,out_f);
		// Fermeture du fichier
		fclose(out_f);
	}
	fclose(in_f);

	Main_OK();
}
